 -- 区域滑动查找文字方法
-- 用于在指定区域滑动查找文字并点击

-- 图片相似度比较类（内联实现）
local 图片相似度比较器 = {}
local log_通用=require("通用方法集合.二次封装方法.Log").Log_通用
-- 基础图片相似度比较
function 图片相似度比较器.基础比较(图片1, 图片2)
    if 图片1 == nil or 图片2 == nil then
        return 0
    end
    return 0.5
end
-- 基于像素比较的相似度计算
function 图片相似度比较器.像素比较(图片1, 图片2, 采样密度)
        采样密度 = 采样密度 or 10
        
        if 图片1 == nil or 图片2 == nil then
            return 0
        end
        
        local 宽度1 = 图片1.getWidth()
        local 高度1 = 图片1.getHeight()
        local 宽度2 = 图片2.getWidth()
        local 高度2 = 图片2.getHeight()
        
        if 宽度1 ~= 宽度2 or 高度1 ~= 高度2 then
            return 0
        end
        
        local 相同像素数 = 0
        local 总采样数 = 0
        
        for x = 1, 宽度1, 采样密度 do
            for y = 1, 高度1, 采样密度 do
                local 像素1 = 图片1.getPixel(x, y)
                local 像素2 = 图片2.getPixel(x, y)
                
                if 像素1 == 像素2 then
                    相同像素数 = 相同像素数 + 1
                end
                
                总采样数 = 总采样数 + 1
            end
        end
        
        if 总采样数 > 0 then
            return 相同像素数 / 总采样数
        else
            return 0
        end
    end
    
-- 基于区域颜色统计的相似度比较
function 图片相似度比较器.颜色比较(图片1, 图片2)
        if 图片1 == nil or 图片2 == nil then
            return 0
        end
        
        local 宽度1 = 图片1.getWidth()
        local 高度1 = 图片1.getHeight()
        local 宽度2 = 图片2.getWidth()
        local 高度2 = 图片2.getHeight()
        
        if 宽度1 ~= 宽度2 or 高度1 ~= 高度2 then
            return 0
        end
        
        local 颜色统计1 = {}
        local 颜色统计2 = {}
        
        for x = 1, 宽度1, 10 do
            for y = 1, 高度1, 10 do
                local 像素1 = 图片1.getPixel(x, y)
                local 像素2 = 图片2.getPixel(x, y)
                
                local 颜色1 = bit.band(像素1, 0xFF0000) / 0x10000
                local 颜色2 = bit.band(像素2, 0xFF0000) / 0x10000
                
                颜色统计1[颜色1] = (颜色统计1[颜色1] or 0) + 1
                颜色统计2[颜色2] = (颜色统计2[颜色2] or 0) + 1
            end
        end
        
        local 相似度 = 0
        local 总颜色数 = 0
        
        for 颜色, 数量1 in pairs(颜色统计1) do
            local 数量2 = 颜色统计2[颜色] or 0
            local 差异 = math.abs(数量1 - 数量2)
            local 最大值 = math.max(数量1, 数量2)
            
            if 最大值 > 0 then
                相似度 = 相似度 + (1 - 差异 / 最大值)
                总颜色数 = 总颜色数 + 1
            end
        end
        
        if 总颜色数 > 0 then
            return 相似度 / 总颜色数
        else
            return 0
        end
    end
    
-- 判断滑动是否到达边界的综合方法
function 图片相似度比较器.判断到达边界(上次截图, 当前截图, 滑动方向)
    if 上次截图 == nil or 当前截图 == nil then
        return false
    end
    
    local 相似度1 = 图片相似度比较器.像素比较(上次截图, 当前截图, 20)
    local 相似度2 = 图片相似度比较器.颜色比较(上次截图, 当前截图)
    
    	if 相似度1 > 0.9 and 相似度2 > 0.9 then
		log_通用("滑动到达" .. (滑动方向 == "向上" and "顶部" or "底部") .. "，相似度: " .. 相似度1 .. ", " .. 相似度2)
		return true
	end
    
    return false
end

-- 内部方法：判断滑动到达边界
local function 判断滑动到达边界(上次截图, 当前截图, 滑动方向)
    return 图片相似度比较器.判断到达边界(上次截图, 当前截图, 滑动方向)
end

local function 点击文字或者选中框(x, y,文字类型)
	local mX=x
	local mY=y
	if 文字类型 == "地区选择" then
		mX=244
		mY=y
	elseif 文字类型 == "地图选择" then
		mX=381
		mY=y+15
	elseif 文字类型 == "杂货键盘选择" then
		mX=520
		mY=y+60
    end
	_ENV["鼠标_随机点击"](mX, mY)
	log_通用("点击选中框实际点击"..mX..","..mY)
end

-- 区域滑动查找文字类
local 区域滑动查找器 = {}

-- 参考Tools.lua的滑动参数设置
local 滑动延时 = 800  -- 滑动时间
local 等待时间 = 400  -- 滑动后等待时间
local 滑动距离比例 = 0.8  -- 滑动距离为区域高度的80%
-- 双向滑动查找文字方法（优化版本）
function 区域滑动查找器.查找文字(区域x1, 区域y1, 区域x2, 区域y2, 查找文字, 最大滑动次数, 点击延迟,文字类型)
	-- 参数说明：
	-- 区域x1, 区域y1, 区域x2, 区域y2: 滑动查找的区域坐标
	-- 查找文字: 要查找的文字内容
	-- 最大滑动次数: 每个方向的最大滑动次数，默认为 10
	-- 点击延迟: 点击后的延迟时间，默认为 1000ms
	

	最大滑动次数 = 最大滑动次数 or 10
	点击延迟 = 点击延迟 or 等待时间
	
	
	
	-- 计算滑动参数（参考Tools.lua的滑动逻辑）
	local 滑动中心x = (区域x1 + 区域x2) / 2
	local 滑动中心y = (区域y1 + 区域y2) / 2  -- 区域正中间的y坐标
	local 滑动区域高度 = 区域y2 - 区域y1
	local 滑动距离 = math.floor(滑动区域高度 * 滑动距离比例)  -- 滑动距离为区域高度的80%
	
	-- 向下滑动：从区域中间向上滑动，内容向下移动
	local 向下滑动起始y = 滑动中心y
	local 向下滑动结束y = 滑动中心y - 滑动距离
	
	-- 向上滑动：从区域中间向下滑动，内容向上移动
	local 向上滑动起始y = 滑动中心y
	local 向上滑动结束y = 滑动中心y + 滑动距离
	
	-- 打印滑动参数用于调试
	--log_通用("滑动参数 - 区域高度: " .. 滑动区域高度 .. ", 滑动距离: " .. 滑动距离)
	--log_通用("向下滑动 - 起始y: " .. 向下滑动起始y .. ", 结束y: " .. 向下滑动结束y)
	--log_通用("向上滑动 - 起始y: " .. 向上滑动起始y .. ", 结束y: " .. 向上滑动结束y)
	
	-- 第一阶段：优先向下滑动查找
	--log_通用("第一阶段：向下滑动查找")
	local 向下滑动次数 = 0
	local 向下连续未找到次数 = 0
	
	while 向下滑动次数 < 最大滑动次数 do
		-- 在当前区域查找文字
		local 查找结果 = _ENV["文字寻找"](区域x1, 区域y1, 区域x2, 区域y2, 3, 查找文字, "模糊", false)
		
		-- 打印OCR识别到的所有文字
		local OCR结果 = _ENV["文字识别881"](区域x1, 区域y1, 区域x2, 区域y2)
		if OCR结果 and OCR结果 ~= "" then
			log_通用("OCR识别到的文字: " .. OCR结果)
		end
		
		if 查找结果 then
			--_ENV["调试输出"]("向下滑动找到文字: " .. 查找文字, true, 500)
			
			-- 点击找到的文字位置
			if _ENV["坐标X"] ~= nil and _ENV["坐标Y"] ~= nil then
				local xy=_ENV["坐标X"]..",".._ENV["坐标Y"]
				--416,562
				local x=_ENV["坐标X"]
				local y=_ENV["坐标Y"]
				--_ENV["鼠标_随机点击"](x, y, 1, 1)
				--_ENV["延迟"](点击延迟)
				点击文字或者选中框(x,y,文字类型)

				return true
			end
		else
			向下连续未找到次数 = 向下连续未找到次数 + 1
		end
		
		-- 执行向下滑动（参考Tools.lua的swipe方法）
		--_ENV["调试输出"]("第" .. (向下滑动次数 + 1) .. "次向下滑动查找", true, 500)
		--_ENV["调试输出"]("滑动从 (" .. 滑动中心x .. "," .. 向下滑动起始y .. ") 到 (" .. 滑动中心x .. "," .. 向下滑动结束y .. ")", true, 500)
		swipe(滑动中心x, 向下滑动起始y, 滑动中心x, 向下滑动结束y, 滑动延时)
		
		-- 等待滑动动画完成
		_ENV["延迟"](等待时间)
		
		-- 判断是否到达底部
		if 向下连续未找到次数 >= 3 then
			log_通用("已到达底部，开始向上查找")
			break
		end
		
		向下滑动次数 = 向下滑动次数 + 1
	end
	
			-- 第二阶段：如果向下没找到，向上滑动查找
	log_通用("第二阶段：向上滑动查找")
	local 向上滑动次数 = 0
	local 向上连续未找到次数 = 0
	
	while 向上滑动次数 < 最大滑动次数 do
		-- 在当前区域查找文字
		local 查找结果 = _ENV["文字寻找"](区域x1, 区域y1, 区域x2, 区域y2, 3, 查找文字, "模糊", false)
		
		-- 打印OCR识别到的所有文字
		local OCR结果 = _ENV["文字识别881"](区域x1, 区域y1, 区域x2, 区域y2)
		if OCR结果 and OCR结果 ~= "" then
			log_通用("OCR识别到的文字: " .. OCR结果)
		end
		
		if 查找结果 then
			log_通用("向上滑动找到文字: " .. 查找文字)
			
			-- 点击找到的文字位置
			if _ENV["坐标X"] ~= nil and _ENV["坐标Y"] ~= nil then
				local xy=_ENV["坐标X"]..",".._ENV["坐标Y"]
				local x=_ENV["坐标X"]
				local y=_ENV["坐标Y"]
	
				点击文字或者选中框(x,y,文字类型)

				return true
			end
		else
			向上连续未找到次数 = 向上连续未找到次数 + 1
		end
		
		-- 执行向上滑动（参考Tools.lua的swipe方法）
		--_ENV["调试输出"]("第" .. (向上滑动次数 + 1) .. "次向上滑动查找", true, 500)
		--_ENV["调试输出"]("滑动从 (" .. 滑动中心x .. "," .. 向上滑动起始y .. ") 到 (" .. 滑动中心x .. "," .. 向上滑动结束y .. ")", true, 500)
		swipe(滑动中心x, 向上滑动起始y, 滑动中心x, 向上滑动结束y, 滑动延时)
		
		-- 等待滑动动画完成
		_ENV["延迟"](等待时间)
		
		-- 判断是否到达顶部
		if 向上连续未找到次数 >= 3 then
			log_通用("已到达顶部")
			break
		end
		
		向上滑动次数 = 向上滑动次数 + 1
	end
	
	log_通用("双向滑动查找完成，未找到文字: " .. 查找文字)
	return false
end



-- 导出类供外部使用
return 区域滑动查找器
